package de.revdev.streckenliste.managedbeans;

import de.revdev.streckenliste.dao.BenutzerDAO;
import de.revdev.streckenliste.dao.RevierDAO;
import de.revdev.streckenliste.dao.StreckenlisteDAO;
import de.revdev.streckenliste.entities.Benutzer;
import de.revdev.streckenliste.entities.Revier;
import de.revdev.streckenliste.entities.Streckenliste;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.MethodExpressionActionListener;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

/**
 *
 * @author f.lindermaier
 */
@Named(value = "navigationBean")
@SessionScoped
public class NavigationBean implements Serializable {

    private Benutzer benutzer;
    @Inject
    private BenutzerDAO bdao;
    @Inject
    private StreckenlisteBean slBean;
    @Inject
    private RevierDAO rdao;
    @Inject
    private StreckenlisteDAO sdao;
    private MenuModel menuModel;
    private Revier selectedRevier;
    private Streckenliste selectedStreckenliste;

    /**
     * Creates a new instance of NavigationBean
     */
    public NavigationBean() {
    }

    @PostConstruct
    public void init() {
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
        benutzer = bdao.findByEMail(request.getRemoteUser());
        createModel();
    }

    public void actionListener(ActionEvent event) {
        MenuItem mi = (MenuItem) event.getComponent();
        if (mi.getAttributes().containsKey("revier")) {
            setSelectedRevier((Revier) mi.getAttributes().get("revier"));
        } else if (mi.getAttributes().containsKey("streckenliste")) {
            setSelectedStreckenliste((Streckenliste) mi.getAttributes().get("streckenliste"));
            setSelectedRevier(getSelectedStreckenliste().getRevier());
            slBean.setTabIndex(0);
        }
    }

    public String selectRevier() {
        return "/faces/user/revierbearb.xhtml?faces-redirect=true";
    }

    public String selectStreckenliste() {
        return "/faces/user/streckenliste.xhtml?faces-redirect=true";
    }

    public void refreshModel() {
        benutzer = bdao.refresh(benutzer);
        if (selectedRevier != null) {
            selectedRevier = rdao.refresh(selectedRevier);
        }
        createModel();
    }

    private void createModel() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ELContext ec = fc.getELContext();
        Application app = fc.getApplication();
        ExpressionFactory ef = app.getExpressionFactory();
        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
        menuModel = new DefaultMenuModel();
        Submenu sm = new Submenu();
        sm.setId(fc.getViewRoot().createUniqueId());
        sm.setLabel("Allgemein");
        if (request.isUserInRole("Jaeger")) {
            MenuItem item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setOutcome("/faces/user/start.xhtml?faces-redirect=true");
            item.setValue("Übersicht");
            sm.getChildren().add(item);
            item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setOutcome("/faces/user/persdaten.xhtml?faces-redirect=true");
            item.setValue("Persönliche Daten");
            sm.getChildren().add(item);
            item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setOutcome("/faces/user/reviere.xhtml?faces-redirect=true");
            item.setValue("Reviere");
            sm.getChildren().add(item);
            item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setActionExpression(ef.createMethodExpression(ec, "#{loginBean.logout}", String.class, new Class[]{}));
            item.setAjax(false);
            item.setValue("Logout");
            sm.getChildren().add(item);
            menuModel.addSubmenu(sm);
            for (Revier r : benutzer.getReviere()) {
                sm = new Submenu();
                sm.setId(fc.getViewRoot().createUniqueId());
                sm.setLabel("Revier " + r.getRevierName());
                item = new MenuItem();
                item.setId(fc.getViewRoot().createUniqueId());
                MethodExpression me = ef.createMethodExpression(ec, "#{navigationBean.actionListener}", null, new Class[]{ActionEvent.class});
                item.addActionListener(new MethodExpressionActionListener(me));
                me = ef.createMethodExpression(ec, "#{navigationBean.selectRevier}", String.class, new Class[]{});
                item.setActionExpression(me);
                item.setAjax(false);
                item.setValue("Bearbeiten");
                item.getAttributes().put("revier", r);
                sm.getChildren().add(item);
                for (Streckenliste sl : r.getStreckenListen()) {
                    item = new MenuItem();
                    item.setId(fc.getViewRoot().createUniqueId());
                    me = ef.createMethodExpression(ec, "#{navigationBean.actionListener}", null, new Class[]{ActionEvent.class});
                    item.addActionListener(new MethodExpressionActionListener(me));
                    me = ef.createMethodExpression(ec, "#{navigationBean.selectStreckenliste}", String.class, new Class[]{});
                    item.setActionExpression(me);
                    item.setAjax(false);
                    item.setValue(sl.getJagdJahr());
                    item.getAttributes().put("streckenliste", sl);
                    sm.getChildren().add(item);
                }
                menuModel.addSubmenu(sm);
            }
        } else {
            MenuItem item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setOutcome("/faces/admin/benutzerverw.xhtml?faces-redirect=true");
            item.setValue("Benutzerverwaltung");
            sm.getChildren().add(item);
            item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setOutcome("/faces/admin/anwendungsverw.xhtml?faces-redirect=true");
            item.setValue("Anwendungsverwaltung");
            sm.getChildren().add(item);
            item = new MenuItem();
            item.setId(fc.getViewRoot().createUniqueId());
            item.setActionExpression(ef.createMethodExpression(ec, "#{loginBean.logout}", String.class, new Class[]{}));
            item.setAjax(false);
            item.setValue("Logout");
            sm.getChildren().add(item);
        }
        menuModel.addSubmenu(sm);
    }

    public MenuModel getMenuModel() {
        return menuModel;
    }

    public void setMenuModel(MenuModel menuModel) {
        this.menuModel = menuModel;
    }

    public Benutzer getBenutzer() {
        return benutzer;
    }

    public void setBenutzer(Benutzer benutzer) {
        this.benutzer = benutzer;
    }

    public Revier getSelectedRevier() {
        return selectedRevier;
    }

    public void setSelectedRevier(Revier selectedRevier) {
        this.selectedRevier = selectedRevier;
    }

    public Streckenliste getSelectedStreckenliste() {
        return selectedStreckenliste;
    }

    public void setSelectedStreckenliste(Streckenliste selectedStreckenliste) {
        this.selectedStreckenliste = selectedStreckenliste;
    }
}
